package cn.jdx.shiro;

import org.apache.shiro.session.Session;
import org.apache.shiro.session.UnknownSessionException;
import org.apache.shiro.session.mgt.eis.AbstractSessionDAO;
import org.springframework.data.redis.core.RedisTemplate;

import java.io.Serializable;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.TimeUnit;

public class RedisSessionDao extends AbstractSessionDAO {

    //(1).声明一个变量
    /*
    由于需要对存放的变量进行CRUD，所以必须要配置redis
     */
    private RedisTemplate<String, Session> redisTemplate;
    //(2).给一个set方法，方便我们交给Spring管理注入
    public void setRedisTemplate(RedisTemplate<String, Session> redisTemplate) {
        this.redisTemplate = redisTemplate;
    }


    //(3).给一些常量作为设置
    public static final int DEFAULT_TIMEOUT = 30;//过期时间30分钟
    public static final String SESSION_PREFIX = "shiro_session";//session的前缀


    private void saveSession(Session session){
        if (session!=null&&session.getId()!=null){
//            System.out.println("[redis]保存session");
            //保存session+设置过期时间为30分钟
            redisTemplate.opsForValue().set(SESSION_PREFIX+session.getId(),session,DEFAULT_TIMEOUT, TimeUnit.MINUTES);
        }
    }

    @Override
    protected Serializable doCreate(Session session) {
        Serializable sessionId = this.generateSessionId(session);
        this.assignSessionId(session,sessionId);
        this.saveSession(session);
        return sessionId;
    }

    @Override
    protected Session doReadSession(Serializable sessionId) {
        if (sessionId!=null){
//            System.out.println("[redis]读取sessionID");
            return redisTemplate.opsForValue().get(SESSION_PREFIX + sessionId);
        }
        return null;
    }

    @Override
    public void update(Session session) throws UnknownSessionException {
        //修改就直接保存就可以了
        this.saveSession(session);
    }

    @Override
    public void delete(Session session) {
//        System.out.println("[redis]:删除session");
        redisTemplate.delete(SESSION_PREFIX+session.getId());
    }

    @Override
    public Collection<Session> getActiveSessions() {
        Set<Session> set = new HashSet<>();
        Set<String> keys = redisTemplate.keys(SESSION_PREFIX + "*");
        assert keys != null;
//        System.out.println("[redis]:获取session集合");
        for (String key : keys){
            System.out.println("key="+key);
            Session session = redisTemplate.opsForValue().get(key);
            System.out.println("value="+session);
            set.add(session);
        }
        return set;
    }
}
